package com.loong.android.tools;

import android.content.Context;
import android.media.AudioManager;

import com.loong.android.utils.ContextUtils;

/**
 * 音量相关的工具类
 */
public class Volume {

    //音量类型-媒体
    public final static int TYPE_STREAM_MUSIC = AudioManager.STREAM_MUSIC;
    //音量类型-通话
    public final static int TYPE_STREAM_VOICE_CALL = AudioManager.STREAM_VOICE_CALL;
    //音量类型-闹钟
    public final static int TYPE_STREAM_ALARM = AudioManager.STREAM_ALARM;
    //音量类型-提示音
    public final static int TYPE_STREAM_NOTIFICATION = AudioManager.STREAM_NOTIFICATION;
    //音量类型-铃声
    public final static int TYPE_STREAM_RING = AudioManager.STREAM_RING;
    //音量类型-系统音量
    public final static int TYPE_STREAM_SYSTEM = AudioManager.STREAM_SYSTEM;

    /**
     * 取最大音量值
     * @param context 上下文
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     */
    public static int getMaxVolume(Context context, int type) {
        if(context == null) return 0;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        return mAudioManager == null ? 0 : mAudioManager.getStreamMaxVolume(type);
    }

    /**
     * 取最大音量值
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     */
    public static int getMaxVolume(int type) {
        return getMaxVolume(ContextUtils.getAppContext(), type);
    }

    /**
     * 取音量值
     * @param context 上下文
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     */
    public static int getVolume(Context context, int type) {
        if(context == null) return 0;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        return mAudioManager == null ? 0 : mAudioManager.getStreamVolume(type);
    }

    /**
     * 取音量值
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     */
    public static int getVolume(int type) {
        return getVolume(ContextUtils.getAppContext(), type);
    }

    /**
     * 设置音量
     * @param context 上下文
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     * @param volume 音量值
     * @param sound 设置时是否播放声音
     * @param ui 设置时是否显示界面
     */
    public static void setVolume(Context context, int type, int volume, boolean sound, boolean ui) {
        if(context == null) return;
        if (volume < 0) volume = 0;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        if (mAudioManager == null) return;
        int flag = 0;
        if (sound) flag = flag | AudioManager.FLAG_PLAY_SOUND;
        if (ui) flag = flag | AudioManager.FLAG_SHOW_UI;
        mAudioManager.setStreamVolume(type, volume, flag);
    }

    /**
     * 设置音量
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     * @param volume 音量值
     * @param sound 设置时是否播放声音
     * @param ui 设置时是否显示界面
     */
    public static void setVolume(int type, int volume, boolean sound, boolean ui) {
        setVolume(ContextUtils.getAppContext(), type, volume, sound, ui);
    }

    /**
     * 调整音量
     * @param context 上下文
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     * @param direction 调整类型: -1=减小音量; 0=保持不变(向用户展示音量); 1=增加音量
     * @param sound 设置时是否播放声音
     * @param ui 设置时是否显示界面
     */
    public static void adjustVolume(Context context, int type, int direction, boolean sound, boolean ui) {
        if(context == null) return;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        if (mAudioManager == null) return;
        int flag = 0;
        if (sound) flag = flag | AudioManager.FLAG_PLAY_SOUND;
        if (ui) flag = flag | AudioManager.FLAG_SHOW_UI;
        mAudioManager.adjustStreamVolume(type, direction, flag);
    }

    /**
     * 调整音量
     * @param type 音量类型，参考常量: TYPE_STREAM_***
     * @param direction 调整类型: -1=减小音量; 0=保持不变(向用户展示音量); 1=增加音量
     * @param sound 设置时是否播放声音
     * @param ui 设置时是否显示界面
     */
    public static void adjustVolume(int type, int direction, boolean sound, boolean ui) {
        adjustVolume(ContextUtils.getAppContext(), type, direction, sound, ui);
    }

    /**
     * 判断扬声器是否已打开
     */
    public static boolean isSpeakerphoneOn(Context context) {
        if (context == null) return false;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        return mAudioManager != null && mAudioManager.isSpeakerphoneOn();
    }

    /**
     * 判断扬声器是否已打开
     */
    public static boolean isSpeakerphoneOn() {
        return isSpeakerphoneOn(ContextUtils.getAppContext());
    }

    /**
     * 打开扬声器
     * @param on
     */
    public static void setSpeakerphoneOn(Context context, boolean on) {
        if (context == null) return;
        AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        if (mAudioManager == null) return;
        mAudioManager.setSpeakerphoneOn(on);
    }

    /**
     * 打开扬声器
     * @param on
     */
    public static void setSpeakerphoneOn(boolean on) {
        setSpeakerphoneOn(ContextUtils.getAppContext(), on);
    }
}
